home *** CD-ROM | disk | FTP | other *** search
/ MacHack 2000 / MacHack 2000.toast / pc / The Hacks / MacHacksBug / Python 1.5.2c1 / Mac / Contrib / IDE mods / Printing / PythonIDEMain.py < prev   
Encoding:
Python Source  |  2000-06-23  |  8.3 KB  |  259 lines

  1. # copyright 1997-1998 Just van Rossum, Letterror. just@letterror.com
  2.  
  3. import Splash
  4.  
  5. import FrameWork
  6. import Win
  7. import Wapplication
  8. import W
  9. import os
  10. import macfs
  11. import Printing
  12.  
  13.  
  14. class PythonIDE(Wapplication.Application):
  15.     
  16.     def __init__(self):
  17.         self.preffilepath = ":Python:PythonIDE preferences"
  18.         Wapplication.Application.__init__(self, 'Pide')
  19.         import AE, AppleEvents
  20.         
  21.         AE.AEInstallEventHandler(AppleEvents.kCoreEventClass, AppleEvents.kAEOpenApplication, 
  22.                 self.ignoreevent)
  23.         AE.AEInstallEventHandler(AppleEvents.kCoreEventClass, AppleEvents.kAEPrintDocuments, 
  24.                 self.ignoreevent)
  25.         AE.AEInstallEventHandler(AppleEvents.kCoreEventClass, AppleEvents.kAEOpenDocuments, 
  26.                 self.opendocsevent)
  27.         AE.AEInstallEventHandler(AppleEvents.kCoreEventClass, AppleEvents.kAEQuitApplication, 
  28.                 self.quitevent)
  29.         import PyConsole, PyEdit
  30.         Splash.wait()
  31.         Splash.uninstall_importhook()
  32.         PyConsole.installoutput()
  33.         PyConsole.installconsole()
  34.         
  35.         self.pageSetup = None  # read from prefs file when needed
  36.         
  37.         import sys
  38.         for path in sys.argv[1:]:
  39.             self.opendoc(path)
  40.         self.mainloop()
  41.     
  42.     def makeusermenus(self):
  43.         m = Wapplication.Menu(self.menubar, "File")
  44.         newitem = FrameWork.MenuItem(m, "New", "N", 'new')
  45.         openitem = FrameWork.MenuItem(m, "Open…", "O", 'open')
  46.         FrameWork.Separator(m)
  47.         closeitem = FrameWork.MenuItem(m, "Close", "W", 'close')
  48.         saveitem = FrameWork.MenuItem(m, "Save", "S", 'save')
  49.         saveasitem = FrameWork.MenuItem(m, "Save as…", None, 'save_as')
  50.         FrameWork.Separator(m)
  51.         saveasappletitem = FrameWork.MenuItem(m, "Save as Applet…", None, 'save_as_applet')
  52.         FrameWork.Separator(m)
  53.         pagesetupitem = FrameWork.MenuItem(m, "Page Setup…", None, 'pagesetup')
  54.         printitem = FrameWork.MenuItem(m, "Print…", 'P', 'print')
  55.         FrameWork.Separator(m)
  56.         quititem = FrameWork.MenuItem(m, "Quit", "Q", 'quit')
  57.         
  58.         m = Wapplication.Menu(self.menubar, "Edit")
  59.         undoitem = FrameWork.MenuItem(m, "Undo", 'Z', "undo")
  60.         FrameWork.Separator(m)
  61.         cutitem = FrameWork.MenuItem(m, "Cut", 'X', "cut")
  62.         copyitem = FrameWork.MenuItem(m, "Copy", "C", "copy")
  63.         pasteitem = FrameWork.MenuItem(m, "Paste", "V", "paste")
  64.         FrameWork.MenuItem(m, "Clear", None,  "clear")
  65.         FrameWork.Separator(m)
  66.         selallitem = FrameWork.MenuItem(m, "Select all", "A", "selectall")
  67.         sellineitem = FrameWork.MenuItem(m, "Select line", "L", "selectline")
  68.         FrameWork.Separator(m)
  69.         finditem = FrameWork.MenuItem(m, "Find…", "F", "find")
  70.         findagainitem = FrameWork.MenuItem(m, "Find again", 'G', "findnext")
  71.         enterselitem = FrameWork.MenuItem(m, "Enter search string", "E", "entersearchstring")
  72.         replaceitem = FrameWork.MenuItem(m, "Replace", None, "replace")
  73.         replacefinditem = FrameWork.MenuItem(m, "Replace & find again", 'T', "replacefind")
  74.         FrameWork.Separator(m)
  75.         shiftleftitem = FrameWork.MenuItem(m, "Shift left", "[", "shiftleft")
  76.         shiftrightitem = FrameWork.MenuItem(m, "Shift right", "]", "shiftright")
  77.         
  78.         m = Wapplication.Menu(self.menubar, "Python")
  79.         runitem = FrameWork.MenuItem(m, "Run window", "R", 'run')
  80.         runselitem = FrameWork.MenuItem(m, "Run selection", None, 'runselection')
  81.         FrameWork.Separator(m)
  82.         moditem = FrameWork.MenuItem(m, "Module browser…", "M", self.domenu_modulebrowser)
  83.         FrameWork.Separator(m)
  84.         mm = FrameWork.SubMenu(m, "Preferences")
  85.         FrameWork.MenuItem(mm, "Set Scripts folder…", None, self.do_setscriptsfolder)
  86.         FrameWork.MenuItem(mm, "Editor default settings…", None, self.do_editorprefs)
  87.         FrameWork.MenuItem(mm, "Set default window font…", None, self.do_setwindowfont)
  88.         
  89.         self.openwindowsmenu = Wapplication.Menu(self.menubar, 'Windows')
  90.         self.makeopenwindowsmenu()
  91.         self._menustocheck = [closeitem, saveitem, saveasitem, saveasappletitem, printitem,
  92.                 undoitem, cutitem, copyitem, pasteitem, 
  93.                 selallitem, sellineitem, 
  94.                 finditem, findagainitem, enterselitem, replaceitem, replacefinditem,
  95.                 shiftleftitem, shiftrightitem, 
  96.                 runitem, runselitem]
  97.         
  98.         prefs = self.getprefs()
  99.         try:
  100.             fss, fss_changed = macfs.RawAlias(prefs.scriptsfolder).Resolve()
  101.             self.scriptsfolder = fss.NewAlias()
  102.         except:
  103.             path = os.path.join(os.getcwd(), ":Mac:IDE scripts")
  104.             if not os.path.exists(path):
  105.                 path = os.path.join(os.getcwd(), "Scripts")
  106.                 if not os.path.exists(path):
  107.                     os.mkdir(path)
  108.                     f = open(os.path.join(path, "Place your scripts here…"), "w")
  109.                     f.close()
  110.             fss = macfs.FSSpec(path)
  111.             self.scriptsfolder = fss.NewAlias()
  112.             self.scriptsfoldermodtime = fss.GetDates()[1]
  113.         else:
  114.             self.scriptsfoldermodtime = fss.GetDates()[1]
  115.         prefs.scriptsfolder = self.scriptsfolder.data
  116.         self._scripts = {}
  117.         self.scriptsmenu = None
  118.         self.makescriptsmenu()
  119.     
  120.     def quitevent(self, theAppleEvent, theReply):
  121.         import AE
  122.         AE.AEInteractWithUser(50000000)
  123.         self._quit()
  124.     
  125.     def suspendresume(self, onoff):
  126.         if onoff:
  127.             fss, fss_changed = self.scriptsfolder.Resolve()
  128.             modtime = fss.GetDates()[1]
  129.             if self.scriptsfoldermodtime <> modtime or fss_changed:
  130.                 self.scriptsfoldermodtime = modtime
  131.                 W.SetCursor('watch')
  132.                 self.makescriptsmenu()
  133.     
  134.     def ignoreevent(self, theAppleEvent, theReply):
  135.         pass
  136.     
  137.     def opendocsevent(self, theAppleEvent, theReply):
  138.         W.SetCursor('watch')
  139.         import aetools
  140.         parameters, args = aetools.unpackevent(theAppleEvent)
  141.         docs = parameters['----']
  142.         if type(docs) <> type([]):
  143.             docs = [docs]
  144.         for doc in docs:
  145.             fss, a = doc.Resolve()
  146.             path = fss.as_pathname()
  147.             self.opendoc(path)
  148.     
  149.     def opendoc(self, path):
  150.         fcreator, ftype = macfs.FSSpec(path).GetCreatorType()
  151.         if ftype == 'TEXT':
  152.             self.openscript(path)
  153.         else:
  154.             W.Message("Can’t open file of type '%s'." % ftype)
  155.     
  156.     def getabouttext(self):
  157.         return "About Python IDE…"
  158.     
  159.     def do_about(self, id, item, window, event):
  160.         Splash.about()
  161.     
  162.     def do_setscriptsfolder(self, *args):
  163.         fss, ok = macfs.GetDirectory("Select Scripts Folder")
  164.         if ok:
  165.             prefs = self.getprefs()
  166.             alis = fss.NewAlias()
  167.             prefs.scriptsfolder = alis.data
  168.             self.scriptsfolder = alis
  169.             self.makescriptsmenu()
  170.             prefs.save()
  171.     
  172.     def domenu_modulebrowser(self, *args):
  173.         W.SetCursor('watch')
  174.         import ModuleBrowser
  175.         ModuleBrowser.ModuleBrowser()
  176.     
  177.     def domenu_open(self, *args):
  178.         fss, ok = macfs.StandardGetFile("TEXT")
  179.         if ok:
  180.             self.openscript(fss.as_pathname())
  181.     
  182.     def domenu_new(self, *args):
  183.         W.SetCursor('watch')
  184.         import PyEdit
  185.         return PyEdit.Editor()
  186.     
  187.     def makescriptsmenu(self):
  188.         W.SetCursor('watch')
  189.         if self._scripts:
  190.             for id, item in self._scripts.keys():
  191.                 if self.menubar.menus.has_key(id):
  192.                     m = self.menubar.menus[id]
  193.                     m.delete()
  194.             self._scripts = {}
  195.         if self.scriptsmenu:
  196.             if hasattr(self.scriptsmenu, 'id') and self.menubar.menus.has_key(self.scriptsmenu.id):
  197.                 self.scriptsmenu.delete()
  198.         self.scriptsmenu = FrameWork.Menu(self.menubar, "Scripts")
  199.         #FrameWork.MenuItem(self.scriptsmenu, "New script", None, self.domenu_new)
  200.         #self.scriptsmenu.addseparator()
  201.         fss, fss_changed = self.scriptsfolder.Resolve()
  202.         self.scriptswalk(fss.as_pathname(), self.scriptsmenu)
  203.     
  204.     def makeopenwindowsmenu(self):
  205.         for i in range(len(self.openwindowsmenu.items)):
  206.             self.openwindowsmenu.menu.DeleteMenuItem(1)
  207.             self.openwindowsmenu.items = []
  208.         windows = []
  209.         self._openwindows = {}
  210.         for window in self._windows.keys():
  211.             title = window.GetWTitle()
  212.             if not title:
  213.                 title = "<no title>"
  214.             windows.append(title, window)
  215.         windows.sort()
  216.         for title, window in windows:
  217.             if title == "Python Interactive":    # ugly but useful hack by Joe Strout
  218.                 shortcut = '0'
  219.             else: 
  220.                 shortcut = None
  221.             item = FrameWork.MenuItem(self.openwindowsmenu, title, shortcut, callback = self.domenu_openwindows)
  222.             self._openwindows[item.item] = window
  223.         self._openwindowscheckmark = 0
  224.         self.checkopenwindowsmenu()
  225.         
  226.     def domenu_openwindows(self, id, item, window, event):
  227.         w = self._openwindows[item]
  228.         w.ShowWindow()
  229.         w.SelectWindow()
  230.     
  231.     def domenu_pagesetup(self):        
  232.         # page setup, ok is 0 when user cancelled
  233.         ok = Printing.PrStlDialog(self.pageSetup)
  234.         # at this point, we should probably save self.pageSetup to preferences
  235.         # or append it to the resources on the document (?)
  236.  
  237.     def domenu_quit(self):
  238.         self._quit()
  239.     
  240.     def domenu_save(self, *args):
  241.         print "Save"
  242.     
  243.     def _quit(self):
  244.         import PyConsole, PyEdit
  245.         PyConsole.console.writeprefs()
  246.         PyConsole.output.writeprefs()
  247.         PyEdit.searchengine.writeprefs()
  248.         for window in self._windows.values():
  249.             try:
  250.                 rv = window.close() # ignore any errors while quitting
  251.             except:
  252.                 rv = 0   # (otherwise, we can get stuck!)
  253.             if rv and rv > 0:
  254.                 return
  255.         self.quitting = 1
  256.  
  257. PythonIDE()
  258.  
  259.